PM: RD大大,客戶又有一個神奇的需求
我: (`・ω・´)
PM: 就是希望在前台嵌入Youtube影片,影片播放完畢要做統計
我: ┳━┳ノ( OωOノ) 好...我來研究
我們都知道Youtube可以用iframe嵌入影片,那問題是怎麼知道他已經撥放完畢了?
經爬文後才知道,只能使用youtube_iframe_api 透過載入script來實現,普通的iframe做不到(就算用MutationObserver
監聽屬性也無效)
文件: https://developers.google.com/youtube/player_parameters?hl=zh-tw
當前端能實現監聽YT影片撥放完畢
之後就是靠API統計資料了~(就看客戶想統計規則和頻率)
讀者們可以撥放 "進階" 的影片,看看撥放完畢後的效果
demo網頁
<!DOCTYPE html>
<html lang="zh-TW">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Embed YouTube Video Demo</title>
</head>
<body>
<h2>普通</h2>
<iframe
id="ytplayer"
type="text/html"
width="320"
height="180"
src="https://www.youtube.com/embed/M7lc1UVf-VE?autoplay=1&origin=http://example.com"
frameborder="0"
></iframe>
<hr />
<h2>進階</h2>
<div id="myYTplayer" class="film"></div>
<script>
let player;
function onYouTubeIframeAPIReady() {
player = new window.YT.Player("myYTplayer", {
height: "360",
width: "640",
videoId: "lg5WKsVnEA4", // 在此替換成你要播放的影片ID (只能是影片 非short)
playerVars: {
autoplay: 1, //自動撥放
controls: 1, //播放器控制項
fs: 0, //fullscreen 縮寫
rel: 0, // 影片結束後不顯示推薦影片
},
events: {
onReady: onPlayerReady,
onStateChange: onPlayerStateChange,
},
});
}
// 監聽播放狀態變更事件
function onPlayerStateChange(event) {
console.log(event.data, YT.PlayerState);
if (event.data === YT.PlayerState.ENDED) {
// 播放完畢時觸發
alert("播放完畢");
}
}
function onPlayerReady(event) {
}
</script>
<script src="https://www.youtube.com/iframe_api"></script>
</body>
</html>
載入 YT iframe_api 後要知道幾件事情
new window.YT.Player(`$標籤id字串`, `$參數`)
$參數
重點講解我認為重要的playerVars
若全域宣告一個方法window.onYouTubeIframeAPIReady
在iframe_api
載入完成後會馬上被呼叫
適合時機: 載入網站時馬上要動態生成嵌入的影片
不然其實點縮圖的時候再靠 click 事件產生就好
縮圖範例:
event.data
會拿到影片狀態數字
這邊列出不同狀態的意思
YT.PlayerState = {
"UNSTARTED": -1, //未開始
"ENDED": 0, //撥放完畢
"PLAYING": 1, //撥放中
"PAUSED": 2, //暫停
"BUFFERING": 3, //載入中
"CUED": 5 //影片被指派或載入後,尚未開始播放
}
影片載入好觸發
如果希望在影片載入好,馬上關閉聲音可以這樣寫:
function onPlayerReady(event) {
event.target.mute();
}
影片縮圖可以使用 https://i.ytimg.com
參考:
https://electrify.tw/archives/355/youtube-thumbnail-downloader/